package pe.com.bbva.ge.vista.vaadin.ui;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.csvalidation.CSValidatedTextField;

import pe.com.bbva.ge.domain.configuracion.Denominacion;
import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.solicitud.DetalleDenominacion;
import pe.com.bbva.ge.domain.solicitud.DetalleMoneda;
import pe.com.bbva.ge.domain.solicitud.Solicitud;
import pe.com.bbva.ge.negocio.SolicitudNegocio;
import pe.com.bbva.ge.utileria.Constante;
import pe.com.bbva.ge.vista.vaadin.ui.component.ComboBoxTipoSolicitud;
import pe.com.bbva.ge.vista.vaadin.ui.component.TxtNumerico;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.bean.MontoMonedas;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.bean.PropiedadesTxtNumerico;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.data.validator.RegexpValidator;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.AbstractTextField.TextChangeEventMode;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

import de.essendi.vaadin.ui.component.numberfield.NumberField;

public class CuerpoDenominacionesUI extends BaseUI implements ClickListener{

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;

	@AutoGenerated
	private Panel pnlMoneda;

	@AutoGenerated
	private VerticalLayout lytTabMoneda;

	@AutoGenerated
	private Table tblMoneda;

	@AutoGenerated
	private Panel pnlBillete;

	@AutoGenerated
	private VerticalLayout lytTabBillete;

	@AutoGenerated
	private Table tblBillete;

	@AutoGenerated
	private HorizontalLayout lytFormulario;

	@AutoGenerated
	private HorizontalLayout lytBotonera;

	@AutoGenerated
	private Button btnATM;

	@AutoGenerated
	private Label label_3;

	@AutoGenerated
	private Button btnAnomalia;

	@AutoGenerated
	private Label label_2;

	@AutoGenerated
	private Button btnRemito;

	@AutoGenerated
	private Label label_1;

	@AutoGenerated
	private VerticalLayout lytTotales;

	@AutoGenerated
	private NumberField txtDiferencia;

	@AutoGenerated
	private TxtNumerico txtMonto;

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	//@AutoGenerated
	//private VerticalLayout verticalLayout_11;

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	/**
	 * 
	 */
	private static final long serialVersionUID = -2849296262562277897L;
	
	@Autowired
	private SolicitudNegocio gestionarSolicitudNegocio;

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	private Solicitud solicitud;
	private ComboBoxTipoSolicitud cmbTipoSolicitud;
	private List<Denominacion> listaBilletes;
	private List<Denominacion> listaMonedas;
	private List<DetalleDenominacion> listaDetalleDenominaciones;
	private Valor moneda;
	private PropiedadesTxtNumerico propTxtNDecimales;
	private PropiedadesTxtNumerico propTxtNEnteros;
	
	private List<MontoMonedas> listaMontoMonedas;

	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public CuerpoDenominacionesUI(Solicitud solicitud, List<Denominacion> listaBilletes, List<Denominacion> listaMonedas, 
									List<DetalleDenominacion> listaDetalleDenominaciones, Valor moneda, List<MontoMonedas> listaMontoMonedas) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		this.solicitud = solicitud;
		this.listaBilletes = listaBilletes;
		this.listaMonedas = listaMonedas;
		this.listaDetalleDenominaciones = listaDetalleDenominaciones;
		this.moneda = moneda;
		this.listaMontoMonedas = listaMontoMonedas;
	}
	
	public void setCmbTipoSolicitud(ComboBoxTipoSolicitud cmbTipoSolicitud) {
		this.cmbTipoSolicitud = cmbTipoSolicitud;
	}
	
	@Override
	public void postConstruccion() {
		this.propTxtNDecimales = new PropiedadesTxtNumerico();
		this.propTxtNDecimales.setEsDecimal(true);
		this.propTxtNEnteros = new PropiedadesTxtNumerico();
		this.propTxtNEnteros.setEsDecimal(false);
		
		txtMonto.setPropiedadesTxtNumerico(this.propTxtNDecimales);
		txtMonto.setValue("0");
		
		txtDiferencia.setCaption("Diferencia:");
		txtDiferencia.setStyleName("v-textfield");
		txtDiferencia.setEnabled(false);
		txtDiferencia.setDecimalAllowed(true);
		txtDiferencia.setDecimalPrecision(2);
		txtDiferencia.setDecimalSeparator('.');
		txtDiferencia.setDecimalSeparatorAlwaysShown(true);
		txtDiferencia.setMinimumFractionDigits(2);
		txtDiferencia.setGroupingUsed(false);
		txtDiferencia.setMinValue(0);
		txtDiferencia.setNegativeAllowed(false);
		
		pnlBillete.setEnabled(false);
		pnlMoneda.setEnabled(false);
		
		btnATM.addListener((ClickListener)this);
		btnRemito.addListener((ClickListener)this);
		Denominacion denominacionMoneda = this.listaBilletes.get(0);
		btnRemito.setData(denominacionMoneda.getMoneda());
		btnAnomalia.addListener((ClickListener)this);
		
		// Para validar el monto
		txtMonto.addListener(new TextChangeListener() {
			public void textChange(TextChangeEvent event) {
		    					
				if(event.getText().trim().length() > 0)
				{
					BigDecimal monto = BigDecimal.valueOf(Double.valueOf(event.getText()));
					boolean seRegistro = false;
					
					if(monto.compareTo(BigDecimal.ZERO) > 0)
					{
						pnlBillete.setEnabled(true);
						pnlMoneda.setEnabled(true);
					}
					
					for(MontoMonedas montoMoneda : getListaMontoMonedas())
					{
						if(montoMoneda.getMoneda().getId() == getMoneda().getId())
						{
							montoMoneda.setMonto(monto);
							seRegistro = true;
							break;
						}
					}
					
					if(!seRegistro)
					{
						MontoMonedas montoMoneda = new MontoMonedas();
						montoMoneda.setMoneda(getMoneda());
						montoMoneda.setMonto(monto);
						getListaMontoMonedas().add(montoMoneda);
					}
				}
				else
				{
					pnlBillete.setEnabled(false);
					pnlMoneda.setEnabled(false);
				}
		    }
		});
		
		txtMonto.setTextChangeEventMode(TextChangeEventMode.LAZY);
		
		// Obteniendo las denominaciones guardadas
		// FIXME: se debe controlar para el caso de que la solicitud tenga varios destinos
		BigDecimal montoTotal = new BigDecimal(0);
		
		if(this.solicitud.getNumero() != null)
		{
			for(DetalleMoneda detalleMoneda : gestionarSolicitudNegocio.obtenerDetalleMonedas(gestionarSolicitudNegocio.obtenerDestinos(this.solicitud).get(0)))
			{
				//DetalleMoneda detalleMoneda = gestionarSolicitudNegocio.obtenerDetalleMoneda(gestionarSolicitudNegocio.obtenerDestinos(this.solicitud).get(0), this.moneda);
				for(DetalleDenominacion detalleDenominacion : gestionarSolicitudNegocio.obtenerDetalleDenominaciones(detalleMoneda))
				{
					if(detalleDenominacion.getDenominacion().getMoneda().getId() == this.moneda.getId())
					{
						this.listaDetalleDenominaciones.add(detalleDenominacion);
						montoTotal = montoTotal.add(detalleDenominacion.getDenominacion().getValor().multiply(new BigDecimal( detalleDenominacion.getSolicitado() )));
					}
				}
			}
			
			txtMonto.setValue(montoTotal.toString());
			
			pnlBillete.setEnabled(true);
			pnlMoneda.setEnabled(true);
		}

		//listaDetalleDenominaciones = new ArrayList<DetalleDenominacion>();
		
		construirTablasDenominaciones();
	}
	
	private void construirTablasDenominaciones()
	{
		int i = 1;
		int totalElementosLista = 0;
		
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty("denominacion", TextField.class,  null);
		container.addContainerProperty("cantidadSolicitado", TextField.class,  null);
		container.addContainerProperty("deteriorados", TextField.class,  null);
		container.addContainerProperty("montoSolicitado", TextField.class,  null);
		container.addContainerProperty("cantidadAprobado", TextField.class,  null);
		container.addContainerProperty("montoAprobado", TextField.class,  null);
		container.addContainerProperty("cantidadRecepcionado", TextField.class,  null);
		container.addContainerProperty("montoRecepcionado", TextField.class,  null);
		container.addContainerProperty("objDenominacion", Denominacion.class,  null);
		tblBillete.setContainerDataSource(container);
		
		tblBillete.setColumnHeader("denominacion", "Denominación");
		tblBillete.setColumnHeader("cantidadSolicitado", "Cantidad <br/> Solicitado");
		tblBillete.setColumnHeader("deteriorados", "Deteriorados");
		tblBillete.setColumnHeader("montoSolicitado", "Monto <br/> Solicitado");
		tblBillete.setColumnHeader("cantidadAprobado", "Cantidad <br/> Aprobado");
		tblBillete.setColumnHeader("montoAprobado", "Monto <br/> Aprobado");
		tblBillete.setColumnHeader("cantidadRecepcionado", "Cantidad <br/> Recepcionado");
		tblBillete.setColumnHeader("montoRecepcionado", "Monto <br/> Recepcionado");
		tblBillete.setColumnHeader("objDenominacion", "objDenominacion");
		
		tblBillete.setColumnWidth("denominacion", 80);
		tblBillete.setColumnWidth("cantidadSolicitado", 80);
		tblBillete.setColumnWidth("deteriorados", 80);
		tblBillete.setColumnWidth("montoSolicitado", 90);
		tblBillete.setColumnWidth("cantidadAprobado", 80);
		tblBillete.setColumnWidth("montoAprobado", 80);
		tblBillete.setColumnWidth("cantidadRecepcionado", 80);
		tblBillete.setColumnWidth("montoRecepcionado", 90);
		tblBillete.setColumnWidth("objDenominacion", 60); 
		
		tblBillete.setStyleName("tbl-header-multi-row");
		
		Denominacion denominacionBlnaca = new Denominacion();
		listaBilletes.add(denominacionBlnaca);
		denominacionBlnaca = new Denominacion();
		listaMonedas.add(denominacionBlnaca);
		
		totalElementosLista = this.listaBilletes.size();
		
		for(Denominacion denominacion : this.listaBilletes)
		{
			Item item = container.addItem(i);
			TextField txtDenominacion = new TextField();
			txtDenominacion.setWidth("75");
			txtDenominacion.setEnabled(false);
			txtDenominacion.setStyleName("txtDenominaciones");
			
			TxtNumerico txtCantidadSoliciado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadSoliciado.setData(i);
			txtCantidadSoliciado.setWidth("75");
			txtCantidadSoliciado.setValue("0");
			
			TxtNumerico txtDeteriorados = new TxtNumerico("", this.propTxtNEnteros);
			txtDeteriorados.setWidth("75");
			txtDeteriorados.setValue("0");
			txtDeteriorados.setData(i);
			
			TxtNumerico txtMontoSolicitado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoSolicitado.setData(i);
			txtMontoSolicitado.setWidth("75");
			txtMontoSolicitado.setValue("0");
			
			TxtNumerico txtCantidadAprobado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadAprobado.setWidth("75");
			txtCantidadAprobado.setValue("0");
			txtCantidadAprobado.setData(i);
			
			TxtNumerico txtMontoAprobado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoAprobado.setWidth("85");
			txtMontoAprobado.setValue("0");
			txtMontoAprobado.setData(i);
			
			TxtNumerico txtCantidadRecepcionado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadRecepcionado.setWidth("75");
			txtCantidadRecepcionado.setValue("0");
			txtCantidadRecepcionado.setData(i);
			
			TxtNumerico txtMontoRecepcionado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoRecepcionado.setWidth("85");
			txtMontoRecepcionado.setValue("0");
			txtMontoRecepcionado.setData(i);
			
			Denominacion objDenominacion = null;
			
			if(i < totalElementosLista)
			{
				boolean seGuardo = false;
				Integer cantidadSolicitado = null;
				
				for(DetalleDenominacion detalleDenominacion : this.listaDetalleDenominaciones)
				{
					if(denominacion.getId() == detalleDenominacion.getDenominacion().getId())
					{
						//cantidadSolicitado = detalleDenominacion.getSolicitado();
						seGuardo = true;
					}
				}
				
				txtDenominacion.setValue(denominacion.getValor());
				objDenominacion = denominacion;
				
				if(seGuardo)
				{
					txtCantidadSoliciado.setValue(cantidadSolicitado.toString());
					txtMontoSolicitado.setValue(denominacion.getValor().multiply( new BigDecimal(cantidadSolicitado)  ).toString());
				}
			}
			
			if(i == totalElementosLista)
			{
				txtDenominacion.setEnabled(false);
				txtDenominacion.setValue("Total:");
				txtCantidadSoliciado.setVisible(false);
				txtDeteriorados.setVisible(false);
				txtMontoSolicitado.setEnabled(false);
				txtCantidadAprobado.setVisible(false);
				txtMontoAprobado.setEnabled(false);
				txtCantidadRecepcionado.setVisible(false);
				txtMontoRecepcionado.setEnabled(false);
			}
			
			if(this.solicitud.getNumero() != null && this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.EN_PROCESO))
			{
				txtCantidadSoliciado.setEnabled(false);
				txtMontoSolicitado.setEnabled(false);
			}

			item.getItemProperty("denominacion").setValue(txtDenominacion);
			item.getItemProperty("cantidadSolicitado").setValue(txtCantidadSoliciado);
			item.getItemProperty("deteriorados").setValue(txtDeteriorados);
			item.getItemProperty("montoSolicitado").setValue(txtMontoSolicitado);
			item.getItemProperty("cantidadAprobado").setValue(txtCantidadAprobado);
			item.getItemProperty("montoAprobado").setValue(txtMontoAprobado);
			item.getItemProperty("cantidadRecepcionado").setValue(txtCantidadRecepcionado);
			item.getItemProperty("montoRecepcionado").setValue(txtMontoRecepcionado);
			item.getItemProperty("objDenominacion").setValue(objDenominacion);
			
			txtCantidadSoliciado.addListener(new TextChangeListener() {
			    public void textChange(TextChangeEvent event) {
			    	Integer cantidadSolicitado = Integer.valueOf(event.getText());
			    	TextField txtActual = (TextField) event.getSource();
			    	txtActual.setValue(event.getText());
			    	
			    	Object itemId = txtActual.getData();
			    	Item item = tblBillete.getItem(itemId);
			    	TextField txtDenominacion = (TextField) item.getItemProperty("denominacion").getValue();
			    	Integer denominacion = Integer.valueOf(txtDenominacion.getValue().toString().trim());
			    	TxtNumerico txtMontoSolicitado = (TxtNumerico) item.getItemProperty("montoSolicitado").getValue();
			    	txtMontoSolicitado.setValue(String.valueOf(cantidadSolicitado * denominacion));			    	
			    	item.getItemProperty("cantidadSolicitado").setValue(txtActual);
			    	item.getItemProperty("montoSolicitado").setValue(txtMontoSolicitado);
			    	
			    	calcularDiferencia(item);
			    	calcularTotales(tblBillete);
			    }
			});
			
			txtMontoSolicitado.addListener(new TextChangeListener() {
				public void textChange(TextChangeEvent event) {
					event.getCursorPosition();
					TxtNumerico txtActual = (TxtNumerico) event.getSource();
			    	Object itemId = txtActual.getData();
			    	Item item = tblBillete.getItem(itemId);
			    	txtActual.setValue(event.getText());
			    	event.getComponent();
			    	// Calculado la cantidad
			    	TextField txtCantidadSolicitado = (TextField) item.getItemProperty("cantidadSolicitado").getValue();
			    	TextField txtDenominacion = (TextField) item.getItemProperty("denominacion").getValue();
			    	BigDecimal denominacion = BigDecimal.valueOf(Double.valueOf(txtDenominacion.getValue().toString()));
			    	BigDecimal monto = BigDecimal.valueOf(Double.valueOf(txtActual.getValue().toString()));
			    	BigDecimal cantidad = monto.divide(denominacion);
			    	txtCantidadSolicitado.setValue(cantidad.toBigInteger().toString());
			    	Integer cantidadNueva = Integer.valueOf(txtCantidadSolicitado.getValue().toString());
			    	txtActual.setValue(String.valueOf(cantidadNueva * Integer.valueOf(denominacion.toBigInteger().toString())));
			    	
			    	item.getItemProperty("cantidadSolicitado").setValue(txtCantidadSolicitado);
			    	item.getItemProperty("montoSolicitado").setValue(txtActual);
			    	
					calcularDiferencia(item);
					calcularTotales(tblBillete);
			    }
			});

			i++;
		}
		
		calcularTotales(tblBillete);
		
		// Monedas
		
		container = new IndexedContainer();
		container.addContainerProperty("denominacion", TextField.class,  null);
		container.addContainerProperty("cantidadSolicitado", TextField.class,  null);
		container.addContainerProperty("deteriorados", TextField.class,  null);
		container.addContainerProperty("montoSolicitado", TextField.class,  null);
		container.addContainerProperty("cantidadAprobado", TextField.class,  null);
		container.addContainerProperty("montoAprobado", TextField.class,  null);
		container.addContainerProperty("cantidadRecepcionado", TextField.class,  null);
		container.addContainerProperty("montoRecepcionado", TextField.class,  null);
		container.addContainerProperty("objDenominacion", Denominacion.class,  null);
		tblMoneda.setContainerDataSource(container);
		
		tblMoneda.setColumnHeader("denominacion", "Denominación");
		tblMoneda.setColumnHeader("cantidadSolicitado", "Cantidad <br/> Solicitado");
		tblMoneda.setColumnHeader("deteriorados", "Deteriorados");
		tblMoneda.setColumnHeader("montoSolicitado", "Monto <br/> Solicitado");
		tblMoneda.setColumnHeader("cantidadAprobado", "Cantidad <br/> Aprobado");
		tblMoneda.setColumnHeader("montoAprobado", "Monto <br/> Aprobado");
		tblMoneda.setColumnHeader("cantidadRecepcionado", "Cantidad <br/> Recepcionado");
		tblMoneda.setColumnHeader("montoRecepcionado", "Monto <br/> Recepcionado");
		tblBillete.setColumnHeader("objDenominacion", "objDenominacion");
		
		tblMoneda.setColumnWidth("denominacion", 80);
		tblMoneda.setColumnWidth("cantidadSolicitado", 80);
		tblMoneda.setColumnWidth("deteriorados", 80);
		tblMoneda.setColumnWidth("montoSolicitado", 90);
		tblMoneda.setColumnWidth("cantidadAprobado", 80);
		tblMoneda.setColumnWidth("montoAprobado", 90);
		tblMoneda.setColumnWidth("cantidadRecepcionado", 80);
		tblMoneda.setColumnWidth("montoRecepcionado", 90);
		tblBillete.setColumnWidth("objDenominacion", 60);
		
		tblMoneda.setStyleName("tbl-header-multi-row");
		
		totalElementosLista = this.listaMonedas.size();
		i = 1;
		
		for(Denominacion denominacion : this.listaMonedas)
		{
			Item item = container.addItem(i);
			TextField txtDenominacion = new TextField();
			txtDenominacion.setWidth("75");
			txtDenominacion.setEnabled(false);
			txtDenominacion.setStyleName("txtDenominaciones");
			
			TxtNumerico txtCantidadSoliciado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadSoliciado.setData(i);
			txtCantidadSoliciado.setWidth("75");
			txtCantidadSoliciado.setValue("0");
			
			TxtNumerico txtDeteriorados = new TxtNumerico("", this.propTxtNEnteros);
			txtDeteriorados.setWidth("75");
			txtDeteriorados.setValue("0");
			txtDeteriorados.setData(i);
			
			TxtNumerico txtMontoSolicitado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoSolicitado.setData(i);
			txtMontoSolicitado.setWidth("75");
			txtMontoSolicitado.setValue("0");
			
			TxtNumerico txtCantidadAprobado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadAprobado.setWidth("75");
			txtCantidadAprobado.setValue("0");
			txtCantidadAprobado.setData(i);
			
			TxtNumerico txtMontoAprobado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoAprobado.setWidth("85");
			txtMontoAprobado.setValue("0");
			txtMontoAprobado.setData(i);
			
			TxtNumerico txtCantidadRecepcionado = new TxtNumerico("", this.propTxtNEnteros);
			txtCantidadRecepcionado.setWidth("75");
			txtCantidadRecepcionado.setValue("0");
			txtCantidadRecepcionado.setData(i);
			
			TxtNumerico txtMontoRecepcionado = new TxtNumerico("", this.propTxtNDecimales);
			txtMontoRecepcionado.setWidth("85");
			txtMontoRecepcionado.setValue("0");
			txtMontoRecepcionado.setData(i);
			
			Denominacion objDenominacion = null;
			
			if(i < totalElementosLista)
			{
				boolean seGuardo = false;
				Integer cantidadSolicitado = null;
				
				for(DetalleDenominacion detalleDenominacion : this.listaDetalleDenominaciones)
				{
					if(denominacion.getId() == detalleDenominacion.getDenominacion().getId())
					{
						//cantidadSolicitado = detalleDenominacion.getSolicitado();
						seGuardo = true;
					}
				}
				
				txtDenominacion.setValue(denominacion.getValor());
				objDenominacion = denominacion;
				
				if(seGuardo)
				{
					txtCantidadSoliciado.setValue(cantidadSolicitado.toString());
					txtMontoSolicitado.setValue(denominacion.getValor().multiply( new BigDecimal(cantidadSolicitado) ).toString());
				}
			}
			
			if(i == totalElementosLista)
			{
				txtDenominacion.setEnabled(false);
				txtDenominacion.setValue("Total:");
				txtCantidadSoliciado.setVisible(false);
				txtDeteriorados.setVisible(false);
				txtMontoSolicitado.setEnabled(false);
				txtCantidadAprobado.setVisible(false);
				txtMontoAprobado.setEnabled(false);
				txtCantidadRecepcionado.setVisible(false);
				txtMontoRecepcionado.setEnabled(false);
			}
			
			if(this.solicitud.getNumero() != null &&  (this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.EN_PROCESO) ||
			   this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.POR_AUTORIZAR_GE) ||
			   this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.POR_AUTORIZAR_SB)))
			{
				txtCantidadSoliciado.setEnabled(false);
				txtMontoSolicitado.setEnabled(false);
				txtDeteriorados.setEnabled(false);
			}
			
			item.getItemProperty("denominacion").setValue(txtDenominacion);
			item.getItemProperty("cantidadSolicitado").setValue(txtCantidadSoliciado);
			item.getItemProperty("deteriorados").setValue(txtDeteriorados);
			item.getItemProperty("montoSolicitado").setValue(txtMontoSolicitado);
			item.getItemProperty("cantidadAprobado").setValue(txtCantidadAprobado);
			item.getItemProperty("montoAprobado").setValue(txtMontoAprobado);
			item.getItemProperty("cantidadRecepcionado").setValue(txtCantidadRecepcionado);
			item.getItemProperty("montoRecepcionado").setValue(txtMontoRecepcionado);
			item.getItemProperty("objDenominacion").setValue(objDenominacion);
			
			txtCantidadSoliciado.addListener(new TextChangeListener() {
			    public void textChange(TextChangeEvent event) {
			    	BigDecimal cantidadSolicitado = BigDecimal.valueOf(Double.valueOf(event.getText()));
			    	TextField txtActual = (TextField) event.getSource();
			    	txtActual.setValue(event.getText());
			    	
			    	Object itemId = txtActual.getData();
			    	Item item = tblMoneda.getItem(itemId);
			    	TextField txtDenominacion = (TextField) item.getItemProperty("denominacion").getValue();
			    	BigDecimal denominacion = BigDecimal.valueOf(Double.valueOf(txtDenominacion.getValue().toString().trim()));
			    	TextField txtMontoSolicitado = (TextField) item.getItemProperty("montoSolicitado").getValue();
			    	txtMontoSolicitado.setValue(String.valueOf(cantidadSolicitado.multiply(denominacion)).toString());
			    	item.getItemProperty("cantidadSolicitado").setValue(txtActual);
			    	item.getItemProperty("montoSolicitado").setValue(txtMontoSolicitado);
			    	
			    	calcularDiferencia(item);
			    	calcularTotales(tblMoneda);
			    }
			});
			
			txtMontoSolicitado.addListener(new TextChangeListener() {
				public void textChange(TextChangeEvent event) {
					TextField txtActual = (TextField) event.getSource();
			    	Object itemId = txtActual.getData();
			    	Item item = tblMoneda.getItem(itemId);
			    	txtActual.setValue(event.getText());
			    	
			    	// Calculado la cantidad
			    	TextField txtCantidadSolicitado = (TextField) item.getItemProperty("cantidadSolicitado").getValue();
			    	TextField txtDenominacion = (TextField) item.getItemProperty("denominacion").getValue();
			    	BigDecimal denominacion = BigDecimal.valueOf(Double.valueOf(txtDenominacion.getValue().toString()));
			    	BigDecimal monto = BigDecimal.valueOf(Double.valueOf(txtActual.getValue().toString()));
			    	BigDecimal cantidad = monto.divide(denominacion);
			    	txtCantidadSolicitado.setValue(cantidad.toBigInteger().toString());
			    	Integer cantidadNueva = Integer.valueOf(txtCantidadSolicitado.getValue().toString());
			    	txtActual.setValue(String.valueOf(cantidadNueva * Integer.valueOf(denominacion.toBigInteger().toString())));
			    	
			    	item.getItemProperty("cantidadSolicitado").setValue(txtCantidadSolicitado);
			    	item.getItemProperty("montoSolicitado").setValue(txtActual);
			    	
					calcularDiferencia(item);
					calcularTotales(tblMoneda);
			    }
			});
			
			i++;
		}
		
		calcularTotales(tblMoneda);
		
		//--------->
		//if(this.solicitud.getTipo().getNombre().equals("Pedido de efectivo de Bóveda")) // Se cambiara por id
		if(this.solicitud.getNumero() != null) 
		{			
			// FIXME Hay que conciderar el tipo de solicitud
			if(this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.REGISTRADO))
			{
				if(this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_DE_BOVEDA) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_ENTRE_OFICINA) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.TRASLADO_DE_EFECTIVO_ENTRE_TRANSPORTADORAS) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_ENTRE_OFICINA) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.COMPENSACION_BBVA_OTROS_BANCOS) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.COMPENSACION_OTROS_BANCOS_BBVA) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.RETIRO_BCRP) ||
				   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.DEPOSITOS_BCRP))
				{
					tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado"});
					tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado"});
				}
				
				if(this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.ENVIO_DE_EFECTIVO_DE_BOVEDA))
				{
					tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado", "deteriorados","montoSolicitado"});
					tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado", "deteriorados","montoSolicitado"});
				}
			}
			
			if(this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.EN_PROCESO))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
			}
			
			
			if(this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.POR_AUTORIZAR_GE))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
			}
			
			if(this.solicitud.getEstado().getCodigo().equals(Constante.ESTADO_SOLICITUD.POR_AUTORIZAR_SB))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado","cantidadAprobado","montoAprobado"});
			}
			
			
			
			
			
			/*if(this.solicitud.getEstado().getNombre().equals("Aprobar"))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado","cantidadAprobado","montoAprobado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado","cantidadAprobado","montoAprobado"});
			}
			
			if(this.solicitud.getEstado().getNombre().equals("Recibir"))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado","cantidadAprobado","montoAprobado","cantidadRecepcionado","montoRecepcionado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado","cantidadAprobado","montoAprobado","cantidadRecepcionado","montoRecepcionado"});
			}
			
			if(this.solicitud.getEstado().getNombre().equals("Enviar"))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","deteriorados","montoSolicitado"});
			}*/
		}
		else
		{
			if(this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_DE_BOVEDA) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_ENTRE_OFICINA) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.TRASLADO_DE_EFECTIVO_ENTRE_TRANSPORTADORAS) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.PEDIDO_DE_EFECTIVO_ENTRE_OFICINA) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.COMPENSACION_BBVA_OTROS_BANCOS) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.COMPENSACION_OTROS_BANCOS_BBVA) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.RETIRO_BCRP) ||
			   this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.DEPOSITOS_BCRP))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado","montoSolicitado"});
			}
			
			if(this.solicitud.getTipo().getCodigo().equals(Constante.TIPO_SOLICITUD.ENVIO_DE_EFECTIVO_DE_BOVEDA))
			{
				tblBillete.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado", "deteriorados","montoSolicitado"});
				tblMoneda.setVisibleColumns(new Object[]{"denominacion","cantidadSolicitado", "deteriorados","montoSolicitado"});
			}
			
			btnAnomalia.setEnabled(false);
			btnATM.setEnabled(false);
			btnRemito.setEnabled(false);
		}
		 
	}
	
	private void calcularDiferencia(Item item)
	{
		TextField txtActual = (TextField) item.getItemProperty("montoSolicitado").getValue();
		BigDecimal montoSolicitado = BigDecimal.valueOf(Double.valueOf(txtActual.getValue().toString()));
		int totalRegistrosBilletes = tblBillete.getItemIds().size();
		int totalRegistrosMonedas = tblMoneda.getItemIds().size();
		int i = 1;
		//this.listaDetalleDenominaciones.clear();
		
		agregarDenominacion(item);
		
		for (Object itemIdN : tblBillete.getItemIds()) {
			Item itemOB = tblBillete.getItem(itemIdN);
			TextField txtMontoSolicitado = (TextField) itemOB.getItemProperty("montoSolicitado").getValue();
			String monto = txtMontoSolicitado.getValue().toString().trim();
			if((monto.length() > 0 && (BigDecimal.valueOf(Double.valueOf(monto)).compareTo(BigDecimal.ZERO) > 0 && i < totalRegistrosBilletes)) && (!txtActual.equals(txtMontoSolicitado)))
			{
				montoSolicitado = montoSolicitado.add(BigDecimal.valueOf(Double.valueOf(monto)));
				//agregarDenominacion(itemOB);
			}
			i++;
		}
		
		i = 1;
		for (Object itemIdN : tblMoneda.getItemIds()) {
			Item itemOB = tblMoneda.getItem(itemIdN);
			TextField txtMontoSolicitado = (TextField) itemOB.getItemProperty("montoSolicitado").getValue();
			String monto = txtMontoSolicitado.getValue().toString().trim();
			if((monto.length() > 0 && (BigDecimal.valueOf(Double.valueOf(monto)).compareTo(BigDecimal.ZERO) > 0 && i < totalRegistrosMonedas)) && (!txtActual.equals(txtMontoSolicitado)))
			{
				montoSolicitado = montoSolicitado.add(BigDecimal.valueOf(Double.valueOf(monto)));
				//agregarDenominacion(itemOB);
			}
			i++;
		}
    	
        BigDecimal montoTotal = BigDecimal.valueOf(Double.valueOf(txtMonto.getValue().toString()));
        BigDecimal diferencia = montoTotal.subtract(montoSolicitado);
        
        txtDiferencia.setValue(diferencia.toString());
	}
	
	private void calcularTotales(Table table)
	{
		BigDecimal montoSolicitado = BigDecimal.valueOf(Double.valueOf("0"));
		int totalRegistros = table.getItemIds().size();
		int i = 1;
		
		for (Object itemIdN : table.getItemIds()) {
			Item itemOB = table.getItem(itemIdN);
			TextField txtMontoSolicitado = (TextField) itemOB.getItemProperty("montoSolicitado").getValue();
			String monto = txtMontoSolicitado.getValue().toString().trim();
			if(monto.length() > 0 && i < totalRegistros)
			{
				montoSolicitado = montoSolicitado.add(BigDecimal.valueOf(Double.valueOf(monto)));
			}
			i++;
		}
		
		Object itemIdMonedas = table.getItemIds().size();
    	Item itemTotalMonedas = table.getItem(itemIdMonedas);
    	TxtNumerico txtMontoSolicitadoTotalMonedas = (TxtNumerico) itemTotalMonedas.getItemProperty("montoSolicitado").getValue();
    	txtMontoSolicitadoTotalMonedas.setValue(montoSolicitado.toString());
    	itemTotalMonedas.getItemProperty("montoSolicitado").setValue(txtMontoSolicitadoTotalMonedas);
	}
	
	private void agregarDenominacion(Item item)
	{
		DetalleDenominacion detalleDenominacion = new DetalleDenominacion();
		Denominacion denominacion = (Denominacion) item.getItemProperty("objDenominacion").getValue();
		boolean agregar = true;
		
		TextField txtCantidadSolicitado = (TextField) item.getItemProperty("cantidadSolicitado").getValue();
		TextField txtDeteriorados = (TextField) item.getItemProperty("deteriorados").getValue();
		TextField txtCantidadAprobado = (TextField) item.getItemProperty("cantidadAprobado").getValue();
		TextField txtCantidadRecepcionado = (TextField) item.getItemProperty("cantidadRecepcionado").getValue();
		
		for(DetalleDenominacion dDenominacion : this.listaDetalleDenominaciones)
		{
			if(dDenominacion.getDenominacion().getId() == denominacion.getId())
			{
				dDenominacion.setDenominacion(denominacion);
				/*dDenominacion.setSolicitado(Integer.valueOf(txtCantidadSolicitado.getValue().toString()));
				dDenominacion.setDeteriorado(Integer.valueOf(txtDeteriorados.getValue().toString()));
				dDenominacion.setAprobado(Integer.valueOf(txtCantidadAprobado.getValue().toString()));
				dDenominacion.setRecepcionado(Integer.valueOf(txtCantidadRecepcionado.getValue().toString()));
				*/agregar = false;
				break;
			}
		}
		
		if(agregar)
		{
			detalleDenominacion.setDenominacion(denominacion);
			/*detalleDenominacion.setSolicitado(Integer.valueOf(txtCantidadSolicitado.getValue().toString()));
			detalleDenominacion.setDeteriorado(Integer.valueOf(txtDeteriorados.getValue().toString()));
			detalleDenominacion.setAprobado(Integer.valueOf(txtCantidadAprobado.getValue().toString()));
			detalleDenominacion.setRecepcionado(Integer.valueOf(txtCantidadRecepcionado.getValue().toString()));
			*/this.listaDetalleDenominaciones.add(detalleDenominacion);
		}
	}
	
	private void registroATM()
	{
		Window wnd;
		AtmUI atmUI = new AtmUI(this.solicitud);
		wnd = new Window("ATM");
		wnd.addComponent(atmUI);
		wnd.setWidth("990px");
		wnd.setHeight("550px");
		wnd.setResizable(false);
		wnd.setModal(true);
		getApplication().getMainWindow().addWindow(wnd);
	}
	
	private void registroAnomalia()
	{
		Window wnd;
		AnomaliaUI anomaliaUI = new AnomaliaUI(this.solicitud, this.moneda);
		wnd = new Window("Anomalías");
		wnd.addComponent(anomaliaUI);
		wnd.setWidth("1095px");
		wnd.setHeight("550px");
		wnd.setResizable(false);
		wnd.setModal(true);
		getApplication().getMainWindow().addWindow(wnd);
	}
	
	private void registroRemito()
	{
		Window wnd;
		Valor moneda = (Valor) btnRemito.getData();
		RemitoUI remitoUI = new RemitoUI(this.solicitud, moneda);
		wnd = new Window("Remitos");
		wnd.addComponent(remitoUI);
		wnd.setWidth("1030px");
		wnd.setHeight("550px");
		wnd.setResizable(false);
		wnd.setModal(true);
		getApplication().getMainWindow().addWindow(wnd);
	}
	
	public Valor getMoneda() {
		return moneda;
	}

	public void setMoneda(Valor moneda) {
		this.moneda = moneda;
	}
	
	public List<MontoMonedas> getListaMontoMonedas() {
		return listaMontoMonedas;
	}

	public void setListaMontoMonedas(List<MontoMonedas> listaMontoMonedas) {
		this.listaMontoMonedas = listaMontoMonedas;
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnATM))
		{
			registroATM();		
		}
		
		if(event.getButton().equals(btnAnomalia))
		{
			registroAnomalia();		
		}
		
		if(event.getButton().equals(btnRemito))
		{
			registroRemito();		
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("740px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("740px");
		setHeight("-1px");
		
		// lytFormulario
		lytFormulario = buildLytFormulario();
		mainLayout.addComponent(lytFormulario);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		mainLayout.addComponent(horizontalLayout_1);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario() {
		// common part: create layout
		lytFormulario = new HorizontalLayout();
		lytFormulario.setImmediate(false);
		lytFormulario.setWidth("-1px");
		lytFormulario.setHeight("-1px");
		lytFormulario.setMargin(false);
		
		// lytTotales
		lytTotales = buildLytTotales();
		lytFormulario.addComponent(lytTotales);
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		lytFormulario.addComponent(lytBotonera);
		
		return lytFormulario;
	}

	@AutoGenerated
	private VerticalLayout buildLytTotales() {
		// common part: create layout
		lytTotales = new VerticalLayout();
		lytTotales.setImmediate(false);
		lytTotales.setWidth("300px");
		lytTotales.setHeight("-1px");
		lytTotales.setMargin(true);
		lytTotales.setSpacing(true);
		
		// txtMonto
		txtMonto = new TxtNumerico("Monto:", this.propTxtNDecimales);
		txtMonto.setImmediate(false);
		txtMonto.setWidth("150px");
		txtMonto.setHeight("-1px");
		lytTotales.addComponent(txtMonto);
		
		// txtDiferencia
		txtDiferencia = new NumberField();
		txtDiferencia.setImmediate(false);
		txtDiferencia.setWidth("150px");
		txtDiferencia.setHeight("-1px");
		lytTotales.addComponent(txtDiferencia);
		
		return lytTotales;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("-1px");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(true);
		lytBotonera.setSpacing(true);
		
		// label_1
		label_1 = new Label();
		label_1.setImmediate(false);
		label_1.setWidth("-1px");
		label_1.setHeight("-1px");
		label_1.setValue("Reg. Remito");
		lytBotonera.addComponent(label_1);
		
		// btnRemito
		btnRemito = new Button();
		btnRemito.setCaption("...");
		btnRemito.setImmediate(true);
		btnRemito.setWidth("-1px");
		btnRemito.setHeight("-1px");
		lytBotonera.addComponent(btnRemito);
		
		// label_2
		label_2 = new Label();
		label_2.setImmediate(false);
		label_2.setWidth("-1px");
		label_2.setHeight("-1px");
		label_2.setValue("Reg. Anomalía");
		lytBotonera.addComponent(label_2);
		
		// btnAnomalia
		btnAnomalia = new Button();
		btnAnomalia.setCaption("...");
		btnAnomalia.setImmediate(true);
		btnAnomalia.setWidth("-1px");
		btnAnomalia.setHeight("-1px");
		lytBotonera.addComponent(btnAnomalia);
		
		// label_3
		label_3 = new Label();
		label_3.setImmediate(false);
		label_3.setWidth("-1px");
		label_3.setHeight("-1px");
		label_3.setValue("Reg. ATM");
		lytBotonera.addComponent(label_3);
		
		// btnATM
		btnATM = new Button();
		btnATM.setCaption("...");
		btnATM.setImmediate(true);
		btnATM.setWidth("-1px");
		btnATM.setHeight("-1px");
		lytBotonera.addComponent(btnATM);
		
		return lytBotonera;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("100.0%");
		horizontalLayout_1.setHeight("100.0%");
		horizontalLayout_1.setMargin(false);
		
		// pnlBillete
		pnlBillete = buildPnlBillete();
		horizontalLayout_1.addComponent(pnlBillete);
		
		// pnlMoneda
		pnlMoneda = buildPnlMoneda();
		horizontalLayout_1.addComponent(pnlMoneda);
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private Panel buildPnlBillete() {
		// common part: create layout
		pnlBillete = new Panel();
		pnlBillete.setCaption("Billetes");
		pnlBillete.setImmediate(false);
		pnlBillete.setWidth("360px");
		pnlBillete.setHeight("-1px");
		
		// lytTabBillete
		lytTabBillete = buildLytTabBillete();
		pnlBillete.setContent(lytTabBillete);
		
		return pnlBillete;
	}

	@AutoGenerated
	private VerticalLayout buildLytTabBillete() {
		// common part: create layout
		lytTabBillete = new VerticalLayout();
		lytTabBillete.setImmediate(false);
		lytTabBillete.setWidth("100.0%");
		lytTabBillete.setHeight("100.0%");
		lytTabBillete.setMargin(false);
		
		// tblBillete
		tblBillete = new Table();
		tblBillete.setImmediate(false);
		tblBillete.setWidth("358px");
		tblBillete.setHeight("250px");
		lytTabBillete.addComponent(tblBillete);
		lytTabBillete.setComponentAlignment(tblBillete, new Alignment(48));
		
		return lytTabBillete;
	}

	@AutoGenerated
	private Panel buildPnlMoneda() {
		// common part: create layout
		pnlMoneda = new Panel();
		pnlMoneda.setCaption("Monedas");
		pnlMoneda.setImmediate(false);
		pnlMoneda.setWidth("360px");
		pnlMoneda.setHeight("-1px");
		
		// lytTabMoneda
		lytTabMoneda = buildLytTabMoneda();
		pnlMoneda.setContent(lytTabMoneda);
		
		return pnlMoneda;
	}

	@AutoGenerated
	private VerticalLayout buildLytTabMoneda() {
		// common part: create layout
		lytTabMoneda = new VerticalLayout();
		lytTabMoneda.setImmediate(false);
		lytTabMoneda.setWidth("100.0%");
		lytTabMoneda.setHeight("100.0%");
		lytTabMoneda.setMargin(false);
		
		// tblMoneda
		tblMoneda = new Table();
		tblMoneda.setImmediate(false);
		tblMoneda.setWidth("358px");
		tblMoneda.setHeight("300px");
		lytTabMoneda.addComponent(tblMoneda);
		lytTabMoneda.setExpandRatio(tblMoneda, 1.0f);
		lytTabMoneda.setComponentAlignment(tblMoneda, new Alignment(48));
		
		return lytTabMoneda;
	}

}
